﻿\subsection{文件控制块}

磁盘属于慢速 I/O 设备，欲打开一个文件，实际上是由 FAT32 根目录开始，依次解析每一级目录，获取子目录的簇，最终从最后一级子目录的簇中取出文件的起始簇号。
因此，打开文件的过程实际上就是获取文件起始簇号的过程。
考虑到磁盘同内存之间的读写速度差距，还可为打开的文件设置读写缓冲区。
文件起始簇号、文件路径等用于操作文件的元信息连同缓冲区一起，构成了文件控制块（File Control Block）。\cite{win-fsdrv}
与线程管理类似，操作系统在内核中维护一个由 FCB 组成的队列。
当线程请求打开某个文件（如 \lstinline{"\SimpleOS\SimpleOS.out"}）时，
由操作系统内核在 FCB 队列中检索具有相同路径字符串的 FCB，若检索到这样的 FCB，则直接将该 FCB 作为打开的文件交付线程，并由该线程所属的进程管理；
否则，才执行读磁盘操作，进而缩减读磁盘操作的耗时。
当某个线程创建新的文件时，可先在内存中预创建相应的 FCB，并在内存缓冲区中提前完成若干次数据写入操作，最后在保存时才为该 FCB 分配相应的磁盘块，将数据保存到磁盘中。

\begin{figure}[h!]
    \Centering
    \caption{FCB 队列}
    \label{FCB_QUEUE}
    \includegraphics[scale=0.75]{build/Paper/Assets/FCB_QUEUE.pdf}
\end{figure}

FCB 的引入还解决了并发线程之间对同一个文件进行读写操作的问题，通过让多个线程共享同一个 FCB，辅以合适的加锁方案，可避免不同线程直接访问磁盘设备可能引发的数据不一致问题。
进程间共享 FCB 还进一步允许分属不同进程的线程之间进行通信，在此基础上可进一步实现管道、流等操作系统内核功能。
